# 2025.03.25力扣网刷题
# 验证外星语词典——数组、哈希表、字符串——简单
# 某种外星语也使用英文小写字母，但可能顺序 order 不同。字母表的顺序（order）是一些小写字母的排列。
# 给定一组用外星语书写的单词 words，以及其字母表的顺序 order，只有当给定的单词在这种外星语中按字典序排列时，返回 true；否则，返回 false。
# 示例 1：
# 输入：words = ["hello", "leetcode"], order = "hlabcdefgijkmnopqrstuvwxyz"
# 输出：true
# 解释：在该语言的字母表中，'h' 位于 'l' 之前，所以单词序列是按字典序排列的。
# 示例 2：
# 输入：words = ["word", "world", "row"], order = "worldabcefghijkmnpqstuvxyz"
# 输出：false
# 解释：在该语言的字母表中，'d' 位于 'l' 之后，那么 words[0] > words[1]，因此单词序列不是按字典序排列的。
# 示例 3：
# 输入：words = ["apple", "app"], order = "abcdefghijklmnopqrstuvwxyz"
# 输出：false
# 解释：当前三个字符 "app" 匹配时，第二个字符串相对短一些，然后根据词典编纂规则 "apple" > "app"，因为 'l' > '∅'，其中 '∅' 是空白字符，定义为比任何其他字符都小（更多信息）。
# 提示：
# 1 <= words.length <= 100
# 1 <= words[i].length <= 20
# order.length == 26
# 在 words[i] 和 order 中的所有字符都是英文小写字母。
# 注意：本题与主站 953 题相同： https ://leetcode-cn.com/problems/verifying-an-alien-dictionary/

class Solution(object):
    def isAlienSorted(self, words, order):
        """
        :type words: List[str]
        :type order: str
        :rtype: bool
        """
        hash = [0] * 26
        for i in range(26):
            key = ord(order[i]) - 97
            hash[key] = i
        length = len(words)
        for i in range(length - 1):
            len1, len2 = len(words[i]), len(words[i+1])
            j, z = 0, 0
            while j < len1 and z < len2:
                key1, key2 = ord(words[i][j]) - 97, ord(words[i+1][z]) - 97
                if hash[key1] < hash[key2]:
                    break
                elif hash[key1] > hash[key2]:
                    return False
                j += 1
                z += 1
            if j < len1 and z == len2:
                return False
        return True